package utils;

import java.lang.reflect.Field;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;

import javax.persistence.Parameter;
import javax.persistence.Query;

import play.Logger;

public class LogUtil {

	// 处理查询单个结果异常
	public static void logqurey(Query query) {
		StringBuffer logstr = new StringBuffer();
		String s = "";
		String sql = "";
		for (Field f : query.getClass().getDeclaredFields()) {
			if ("query".equals(f.getName())) {
				f.setAccessible(true);
				try {
					s = f.get(query).toString();
					sql = s.substring(s.indexOf("(") + 1, s.lastIndexOf(")"));
				} catch (Exception e1) {
					
					LogUtil.logerror("记录Query日志出错:" + new Date());
				}
				f.setAccessible(false);
				break;
			}
		}
		logstr.append("\r\n").append(sql).append("\r\n");
		Set<Parameter<?>> parameters = query.getParameters();
		Iterator<Parameter<?>> i = parameters.iterator();
		while (i.hasNext()) {
			Parameter<?> p = (Parameter<?>) i.next();
			logstr.append(p.getName()).append("=").append(query.getParameterValue(p.getName())).append(",");
		}
		LogUtil.logerror(logstr.toString());
	}

	private static String getMessageHead(String orderNO) {
		StringBuffer sb = new StringBuffer("");
		StackTraceElement[] eles = Thread.currentThread().getStackTrace();
		sb.append("class:").append(eles[4].getClassName()).append(",").append("method:").append(eles[4].getMethodName());
		if (!(null == orderNO || "".equals(orderNO))) {// 有订单信息
			sb.append(",").append("order:").append(orderNO);
		}
		sb.append("#");
		return sb.toString();
	}

	/**
	 * 记录error级别的日志信息
	 * 
	 * @param orderNO
	 *            ：订单号
	 * @param masg
	 *            ：错误信息
	 * @param e
	 *            Exception 异常对象
	 */
	public static void logerror(String orderNO, String masg, Exception e) {
		StringBuffer sb = new StringBuffer(LogUtil.getMessageHead(orderNO));
		sb.append(masg);
		Logger.log4j.error(sb.toString(), e);
	}
	
	/**
	 * 记录error级别的日志信息
	 * @param masg
	 *            ：错误信息
	 * @param e
	 *            Exception 异常对象
	 */
	
	public static void logerror(String masg, Exception e) {
		logerror(null, masg, e);
	}
	/**
	 * 记录error级别的日志信息
	 * 
	 * @param masg
	 *            ：错误信息
	 */
	public static void logerror(String masg) {
		logerror(null, masg, null);
	}
	/**
	 * 记录trace级别的日志信息
	 * 
	 * @param orderNO
	 *            ：订单号
	 * @param masg
	 *            ：错误信息
	 * @param e
	 *            Exception 异常对象
	 */
	public static void logtrace(String orderNO, String masg, Exception e) {
		StringBuffer sb = new StringBuffer(LogUtil.getMessageHead(orderNO));
		sb.append(masg);
		Logger.log4j.trace(sb.toString(), e);
	}
	/**
	 * 记录trace级别的日志信息
	 * @param masg
	 *            ：错误信息
	 * @param e
	 *            Exception 异常对象
	 */
	
	public static void logtrace(String masg, Exception e) {
		logtrace(null, masg, e);
	}
	/**
	 * 记录trace级别的日志信息
	 * 
	 * @param masg
	 *            ：错误信息
	 */
	public static void logtrace(String masg) {
		logtrace(null, masg, null);
	}
	
	/**
	 * 记录info级别的日志信息
	 * 
	 * @param orderNO
	 *            ：订单号
	 * @param masg
	 *            ：错误信息
	 * @param e
	 *            Exception 异常对象
	 */
	public static void loginfo(String orderNO, String masg, Exception e) {
		StringBuffer sb = new StringBuffer(LogUtil.getMessageHead(orderNO));
		sb.append(masg);
		Logger.log4j.info(sb.toString(), e);
	}
	/**
	 * 记录info级别的日志信息
	 * @param masg
	 *            ：错误信息
	 * @param e
	 *            Exception 异常对象
	 */
	
	public static void loginfo(String masg, Exception e) {
		loginfo(null, masg, e);
	}
	/**
	 * 记录info级别的日志信息
	 * 
	 * @param masg
	 *            ：错误信息
	 */
	public static void loginfo(String masg) {
		loginfo(null, masg, null);
	}
}
